package com.JUC;

import java.util.concurrent.CyclicBarrier;

public  class JUC07_AuxiliaryClass {
    public static void main(String[] args) throws InterruptedException {

        // CountDownLatch 自习，班长锁门
        /*
        CountDownLatch countDownLatch = new CountDownLatch(6);
        for (int i = 1; i <= 6; i++){
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+"\t离开教室");
                //离开一个同学，计数减一
                countDownLatch.countDown();
            },String.valueOf(i)).start();
        }
        // 先阻塞，不让班长离开
        countDownLatch.await();
        System.out.println(Thread.currentThread().getName()+"班长最后离开");
         */

        // CyclicBarrier 集合开会

        /*// 一般使用的构造方法 ： CyclicBarrier(int parties, Runnable barrierAction)
        CyclicBarrier cyclicBarrier = new CyclicBarrier(6,() -> {
            System.out.println("==== 会议开始 ====");
        });


        for (int i = 1; i <= 6; i++){
            // Lambda 表达式中，不能使用局部变量，只能使用 final
            final int peo = i;
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+"\t进入会议室,已进入："+peo+"人");
                try {
                    // 阻塞
                    cyclicBarrier.await();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            },String.valueOf(i)).start();
        }*/


        // Semaphore 抢车位
        /*
        Semaphore semaphore = new Semaphore(3);
        for (int i = 1; i <= 6; i++){
            new Thread(()->{
                try {
                    //抢占资源，资源数自动减一
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName()+"\t抢到车位+++++");
                    //持有资源一段时间
                    try {
                        TimeUnit.SECONDS.sleep(3);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName()+"\t离开车位---");

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                    //释放持有的资源
                    semaphore.release();
                }
            },String.valueOf(i)).start();
        }
         */

    }
}

